/*
 +----------------------------------------------------------------------
 + Title        : http 请求工具
 + Author       : huwl
 + Version      : 1.0.0
 + Initial-Time : 2023-07-08
 + Last-time    : 这个文件最后修改的时间 + 修改人的名称
 + Desc         : http 请求工具
 +----------------------------------------------------------------------
*/

import { useUserStore } from "@/stores"


let baseURL = ''
if (import.meta.env.DEV) {
    // baseURL = 'http://localhost:8180'
    baseURL = 'https://api-mall-www.itrident.cn'
}

if (import.meta.env.PROD) {
    baseURL = 'https://api-mall-www.itrident.cn'
}


const prefix = '/api/v1/'
// 前置拦截器
const httpInterceptor = {
    // 拦截前触发
    invoke(options: UniApp.RequestOptions) {
        if (!options.url.startsWith('http')) {
            // #ifndef H5
            options.url = baseURL + prefix + options.url
            // #endif

            // #ifdef H5
            options.url = prefix + options.url
            // #endif
        }

        // 超时时间
        options.timeout = 10000

        // 添加小程序请求头标识
        options.header = {
            ...options.header,
            'source-client': 'miniapp'
        }

        const userStore = useUserStore()
        const token = userStore.profile?.token

        // 添加token
        if (token) {
            options.header = {
                ...options.header,
                'Authorization': 'Bearer ' + token
            }
        }

        uni.showLoading({
            title: '加载中...',
            mask: true
        })
    }
}

/**
 * 添加拦截器
 */
uni.addInterceptor('request', httpInterceptor)


interface Data<T> {
    code: string,
    message: string,
    data: T
}

/**
 * 请求函数
 * 使用泛型
 */
export const http = <T>(options: UniApp.RequestOptions) => {
    return new Promise<Data<T>>((resolve, reject) => {
        uni.request({
            ...options,
            success(res) {
                uni.hideLoading()
                // 状态码200
                if (res.statusCode >= 200 && res.statusCode < 300) {
                    const result = res.data as Data<T>
                    // token错误、过期、刷新token失败等，需要重新登录
                    if (result.code == '401' || result.code == '402' || result.code == '407') {
                        const userStore = useUserStore()
                        userStore.clearProfile()
                        uni.redirectTo({
                            url: '/pages/password_login/index'
                        })

                        reject(res)
                    } else if (result.code == '400') {
                        uni.showToast({
                            icon: 'none',
                            title: result.message || '请求错误!',
                        })
                        reject(res)
                    } else {
                        resolve(result)
                    }
                }
            },
            fail(err) {
                uni.hideLoading()
                uni.showToast({
                    icon: 'none',
                    title: '网络开小差,换网络试试!',
                })
                reject(err)
            },
        })
    })
}